/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package LogicaNegocio.Controlador;

import AccesoDatos.Persistencia.Manager.ManagerInformes;
import AccesoDatos.Persistencia.Manager.ManagerOrden;
import AccesoDatos.Persistencia.Manager.ManagerUsuario;
import GUI.Bibliotecario.AdminPrestamos.PanelBuscarLibro;
import LogicaNegocio.Biblioteca.Area;
import LogicaNegocio.Biblioteca.Autor;
import LogicaNegocio.Biblioteca.Ejemplar;
import LogicaNegocio.Biblioteca.Libro;
import LogicaNegocio.Biblioteca.Orden;
import LogicaNegocio.Biblioteca.PalabraClave;
import LogicaNegocio.Usuarios.Usuario;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * Esta clase en java permite el control de eventos
 * para la busqueda de libros en el sistema.
 *
 * @author sebaxtian
 * Archivo: ControlBuscarLibro.java
 * @version 1.0
 * Fecha: mar may 25 04:01:36 COT 2010
 */


public class ControlBuscarLibro {

    //Atributos de clase
    private PanelBuscarLibro panelBuscarLibro;
    private ManagerInformes gestorInformes;
    private List<Libro> listaLibrosEncontrados;


    public ControlBuscarLibro(PanelBuscarLibro panelBuscarLibro) {
        this.panelBuscarLibro = panelBuscarLibro;
        gestorInformes = new ManagerInformes();
        listaLibrosEncontrados = new ArrayList<Libro>();
    }

    public void buscar() {
        try {
            Long isbn;
            String primerNombreAutor;
            String segundoNombreAutor;
            String primerApellidoAutor;
            String segundoApellidoAutor;
            String titulo;
            String palabraClave;
            String areaConocimiento;
            String idioma;
            String editorial;
            int anoPublicacion;
            //carga los datos del formulario
            isbn = Long.parseLong(panelBuscarLibro.textFieldISBNBuscar.getText().equals("") ? "-1" : panelBuscarLibro.textFieldISBNBuscar.getText());
            primerApellidoAutor = panelBuscarLibro.textFieldPrimerApellidoBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldPrimerApellidoBuscar.getText();
            primerNombreAutor = panelBuscarLibro.textFieldPrimerNombreBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldPrimerNombreBuscar.getText();
            segundoApellidoAutor = panelBuscarLibro.textFieldSegundoApellidoBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldSegundoApellidoBuscar.getText();
            segundoNombreAutor = panelBuscarLibro.textFieldSegundoNombreBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldSegundoNombreBuscar.getText();
            titulo = panelBuscarLibro.textFieldTituloBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldTituloBuscar.getText();
            palabraClave = panelBuscarLibro.textFieldPalabraClaveBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldPalabraClaveBuscar.getText();
            areaConocimiento = panelBuscarLibro.textFieldAreaConocimientoBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldAreaConocimientoBuscar.getText();
            idioma = panelBuscarLibro.textFieldIdiomaBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldIdiomaBuscar.getText();
            editorial = panelBuscarLibro.textFieldEditorialBuscar.getText().equals("") ? null : panelBuscarLibro.textFieldEditorialBuscar.getText();
            anoPublicacion = Integer.parseInt(panelBuscarLibro.textFieldAnoPublicacionBuscar.getText().equals("") ? "-1" : panelBuscarLibro.textFieldAnoPublicacionBuscar.getText());
            anoPublicacion = Integer.parseInt(panelBuscarLibro.textFieldAnoPublicacionBuscar.getText().length() < 4 ? "99999" : panelBuscarLibro.textFieldAnoPublicacionBuscar.getText());
            //Busca los libros con los datos del formulario
            listaLibrosEncontrados = gestorInformes.buscarLibro(isbn, titulo, primerNombreAutor, segundoNombreAutor, primerApellidoAutor, segundoApellidoAutor, palabraClave, editorial, areaConocimiento, anoPublicacion, idioma);
            if(listaLibrosEncontrados.size() > 0){
                mostrarResultados();
                limpiar();
                JOptionPane.showMessageDialog(panelBuscarLibro, "La busqueda arrojo resultados", "Buscar Libro", JOptionPane.PLAIN_MESSAGE);
            }else{
                JOptionPane.showMessageDialog(panelBuscarLibro, "La busqueda NO arrojo resultados", "Buscar Libro", JOptionPane.INFORMATION_MESSAGE);
                limpiar();
                limpiarTabla();
            }
        }catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(panelBuscarLibro, "El formato para isbn y año de publicacion son numeros enteros", "Error Datos", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void mostrarResultados() {
        Libro libro;
        for(int i = 0; i < listaLibrosEncontrados.size(); i++){
            if(panelBuscarLibro.tablaResultadoBusqueda.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaResultadoBusqueda.getModel();
                Object fila[] = {"","","",""};
                tmp.addRow(fila);
            }
            libro = listaLibrosEncontrados.get(i);
            panelBuscarLibro.tablaResultadoBusqueda.setValueAt(libro.getIsbn(), i, 0);
            panelBuscarLibro.tablaResultadoBusqueda.setValueAt(libro.getTitulo(), i, 1);
            panelBuscarLibro.tablaResultadoBusqueda.setValueAt(libro.getListaEjemplares().size(), i, 2);
        }
    }

    public void verDescripcion() {
        Libro libro = obtenerLibroSeleccionado();
        if(libro != null){
            mostraListaAreas(libro.getListaAreas());
            mostrarListaAutores(libro.getListaAutores());
            mostrarListaPalabras(libro.getListaPalabrasClave());
            int dia, mes, ano;
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(libro.getAnoPublicacion());
            dia = calendario.get(Calendar.DAY_OF_MONTH);
            mes = calendario.get(Calendar.MONTH)+1;
            ano = calendario.get(Calendar.YEAR);
            panelBuscarLibro.textFieldAnoPublicacionDes.setText(dia+"/"+mes+"/"+ano);
            panelBuscarLibro.textFieldCodEditorialDes.setText(libro.getCodigoEditorial()+"");
            panelBuscarLibro.textFieldCodigoEditorialDes.setText(libro.getCodigoEditorial()+"");
            panelBuscarLibro.textFieldISBNDes.setText(libro.getIsbn().toString());
            panelBuscarLibro.textFieldIdiomaDes.setText(libro.getIdioma());
            panelBuscarLibro.textFieldNombreEditorialDes.setText(libro.getEditorial().getNombre());
            panelBuscarLibro.textFieldNumeroBusquedasDes.setText(libro.getCantidadBusquedas()+"");
            panelBuscarLibro.textFieldPaisEditorialDes.setText(libro.getEditorial().getPais());
            panelBuscarLibro.textFieldTituloDes.setText(libro.getTitulo());
            panelBuscarLibro.textFieldWebEditorialDes.setText(libro.getEditorial().getPaginaWeb());
            panelBuscarLibro.checkBoxActivoDes.setSelected(libro.getActivo());
        }
    }

    private Libro obtenerLibroSeleccionado() {
        Long isbn = -1L;
        Libro libro = null;
        int fila = panelBuscarLibro.tablaResultadoBusqueda.getSelectedRow();
        if(fila != -1){
            isbn = Long.parseLong(panelBuscarLibro.tablaResultadoBusqueda.getValueAt(fila, 0).toString());
        }
        for(int i = 0; i < listaLibrosEncontrados.size(); i++){
            if(isbn.equals(listaLibrosEncontrados.get(i).getIsbn())){
                libro = listaLibrosEncontrados.get(i);
                break;
            }
        }
        return libro;
    }

    private void mostrarListaAutores(List<Autor> listaAutores) {
        Autor autor;
        for(int i = 0; i < listaAutores.size(); i++){
            if(panelBuscarLibro.tablaAutoresDes.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaAutoresDes.getModel();
                Object fila[] = {"",""};
                tmp.addRow(fila);
            }
            autor = listaAutores.get(i);
            panelBuscarLibro.tablaAutoresDes.setValueAt(autor.getCodigoAutor(), i, 0);
            String nombreCompleto;
            nombreCompleto = autor.getPrimerNombre()+" ";
            if(autor.getSegundoNombre() != null){
                nombreCompleto += autor.getSegundoNombre()+" ";
            }
            nombreCompleto += autor.getPrimerApellido()+" ";
            if(autor.getSegundoApellido() != null){
                nombreCompleto += autor.getSegundoApellido();
            }
            panelBuscarLibro.tablaAutoresDes.setValueAt(nombreCompleto, i, 1);
        }
    }

    private void mostraListaAreas(List<Area> listaAreas) {
        Area area;
        for(int i = 0; i < listaAreas.size(); i++){
            if(panelBuscarLibro.tablaAreasConocimientoDes.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaAreasConocimientoDes.getModel();
                Object fila[] = {"",""};
                tmp.addRow(fila);
            }
            area = listaAreas.get(i);
            panelBuscarLibro.tablaAreasConocimientoDes.setValueAt(area.getCodigoArea(), i, 0);
            String nombre = area.getNombre();
            panelBuscarLibro.tablaAreasConocimientoDes.setValueAt(nombre, i, 1);
        }
    }

    private void mostrarListaPalabras(List<PalabraClave> listaPalabras) {
        PalabraClave palabra;
        for(int i = 0; i < listaPalabras.size(); i++){
            if(panelBuscarLibro.tablaPalabrasClaveDes.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaPalabrasClaveDes.getModel();
                Object fila[] = {"",""};
                tmp.addRow(fila);
            }
            palabra = listaPalabras.get(i);
            panelBuscarLibro.tablaPalabrasClaveDes.setValueAt(palabra.getIdPalabra(), i, 0);
            panelBuscarLibro.tablaPalabrasClaveDes.setValueAt(palabra.getNombre(), i, 1);
        }
    }

    public void verEjemplares() {
        Libro libro = obtenerLibroSeleccionado();
        if(libro != null){
            limpiarTablaEjemplares();
            mostrarEjemplares(libro.getListaEjemplares());
        }
    }

    private void mostrarEjemplares(List<Ejemplar> listaEjemplares) {
        Ejemplar ejemplar;
        for(int i = 0; i < listaEjemplares.size(); i++){
            if(panelBuscarLibro.tablaEjemplares.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaEjemplares.getModel();
                Object fila[] = {"","","","","","",""};
                tmp.addRow(fila);
            }
            ejemplar = listaEjemplares.get(i);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getIdEjemplar(), i, 0);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getIsbn(), i, 1);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getNumeroSala(), i, 2);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getNumeroPasillo(), i, 3);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getNumeroEstante(), i, 4);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.getNumeroCajon(), i, 5);
            panelBuscarLibro.tablaEjemplares.setValueAt(ejemplar.isDisponible(), i, 6);
        }
    }

    public void ordenarEjemplar() {
        Ejemplar ejemplar = obtenerEjemplarSeleccionado();
        Usuario usuario;
        int numeroOrden;
        int identificacionUsuario = -1;
        String identificacion = JOptionPane.showInputDialog(panelBuscarLibro, "Ingrese su numero de identificacion", "Usuario", JOptionPane.QUESTION_MESSAGE);
        try{
            identificacionUsuario = Integer.parseInt(identificacion);
            usuario = new ManagerUsuario().obtenerUsuario(identificacionUsuario);
            if(ejemplar.isDisponible()){
                numeroOrden = registrarOrden(usuario, ejemplar);
                JOptionPane.showMessageDialog(panelBuscarLibro, "Orden registrada, el numero de orden es: "+numeroOrden, "Orden", JOptionPane.PLAIN_MESSAGE);
            }else{
                JOptionPane.showMessageDialog(panelBuscarLibro, "El ejemplar seleccionado no esta disponible", "Orden", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch(NumberFormatException ex) {
            JOptionPane.showMessageDialog(panelBuscarLibro, "El numero de identificacion debe ser numero entero", "Error", JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(panelBuscarLibro, "El Usuario no esta registrado en biblioteca, solicite un registro ante un bibliotecario", "Usuario No Registrado", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private int registrarOrden(Usuario usuario, Ejemplar ejemplar) {
        int numeroOrden = -1;
        ManagerOrden gestorOrden = new ManagerOrden();
        Orden orden = new Orden();
        Date fecha = Calendar.getInstance().getTime();
        Date hora = Calendar.getInstance().getTime();
        orden.setEjemplar(ejemplar);
        orden.setIdEjemplar(ejemplar.getIdEjemplar());
        orden.setUsuario(usuario);
        orden.setIdentificacionUsuario(usuario.getIdentificacionUsuario());
        orden.setFecha(fecha);
        orden.setHora(hora);
        orden.setCancelada(false);
        gestorOrden.crearOrden(orden);
        numeroOrden = gestorOrden.idUltimaOrden();
        return numeroOrden;
    }

    private Ejemplar obtenerEjemplarSeleccionado() {
        int idEjemplar = -1;
        Ejemplar ejemplar = null;
        Libro libro = obtenerLibroSeleccionado();
        int fila = panelBuscarLibro.tablaEjemplares.getSelectedRow();
        if(fila != -1){
            idEjemplar = Integer.parseInt(panelBuscarLibro.tablaEjemplares.getValueAt(fila, 0).toString());
        }
        if(libro != null){
            for(int i = 0; i < libro.getListaEjemplares().size(); i++){
                if(idEjemplar == libro.getListaEjemplares().get(i).getIdEjemplar()){
                    ejemplar = libro.getListaEjemplares().get(i);
                    break;
                }
            }
        }
        return ejemplar;
    }

    public void limpiar() {
        panelBuscarLibro.textFieldAnoPublicacionBuscar.setText("");
        panelBuscarLibro.textFieldAreaConocimientoBuscar.setText("");
        panelBuscarLibro.textFieldEditorialBuscar.setText("");
        panelBuscarLibro.textFieldISBNBuscar.setText("");
        panelBuscarLibro.textFieldIdiomaBuscar.setText("");
        panelBuscarLibro.textFieldPalabraClaveBuscar.setText("");
        panelBuscarLibro.textFieldPrimerApellidoBuscar.setText("");
        panelBuscarLibro.textFieldPrimerNombreBuscar.setText("");
        panelBuscarLibro.textFieldSegundoApellidoBuscar.setText("");
        panelBuscarLibro.textFieldSegundoNombreBuscar.setText("");
        panelBuscarLibro.textFieldTituloBuscar.setText("");
    }

    public void limpiarTabla() {
        DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaResultadoBusqueda.getModel();
        for(int i = 0; i < panelBuscarLibro.tablaResultadoBusqueda.getRowCount(); i++){
            tmp.removeRow(i);
            if(tmp.getRowCount()>0){
                limpiarTabla();
            }
        }
        limpiarTablaEjemplares();
        listaLibrosEncontrados.clear();
    }

    private void limpiarTablaEjemplares() {
        DefaultTableModel tmp = (DefaultTableModel)panelBuscarLibro.tablaEjemplares.getModel();
        for(int i = 0; i < panelBuscarLibro.tablaEjemplares.getRowCount(); i++){
            tmp.removeRow(i);
            if(tmp.getRowCount()>0){
                limpiarTablaEjemplares();
            }
        }
    }
    
}
